﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data;
//using System.Data.SqlClient;
using System.Data.SQLite;
using System.Configuration;
using System.IO;
using System.Drawing;
using System.Drawing.Printing;
using System.Xml;

namespace ProductDB
{
    public partial class BDViewsDG : Form
    {
        //private SqlConnection sqlConnection;
        private SQLiteConnection sqliteConnection;
        public_method pm = new public_method();

        string Email = String.Empty;
        int role = 0;
        int Role = 0;

        int offsetCR = 0; // для вкладки "Current Repairs"
        int rowsCR = 50;

        int offsetWR = 0; // для вкладки "Warranty Repair"
        int rowsWR = 50;

        int offsetOW = 0; // для вкладки "One Week Check"
        int rowsOW = 50;

        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();

        public BDViewsDG(string email)
        {
            InitializeComponent();
            string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
            //sqlConnection = new SqlConnection(connectionString);
            //sqlConnection.Open();
            sqliteConnection = new SQLiteConnection(connectionString);
            sqliteConnection.Open();

            //Role = pm.GetRole(email, sqlConnection);
            Role = pm.GetRole(email, sqliteConnection);

            dataGridView1.CellValueChanged += dataGridView_CellValueChanged;
            dataGridView2.CellValueChanged += dataGridView_CellValueChanged;
            dataGridView3.CellValueChanged += dataGridView_CellValueChanged;

            dataGridView1.KeyDown += DataGridView_KeyDown;
            dataGridView2.KeyDown += DataGridView_KeyDown;
            dataGridView3.KeyDown += DataGridView_KeyDown;

            int tabIndex = tabControl1.SelectedIndex;
            List<Tuple<string, string>> collection = GetCollection(tabIndex);
            comboBox1.DataSource = collection.Select(x => x.Item1).ToList();

            //label2.Text = "Подключен к БД: " + sqlConnection.ConnectionString;
            label2.Text = "Подключен к БД: " + sqliteConnection.ConnectionString;
            //label3.Text = "Здравствуйте " + pm.GetName(email, sqlConnection);
            label3.Text = "Здравствуйте " + pm.GetName(email, sqliteConnection);

            timer1.Enabled = true;
            /*
            if (tabControl1.SelectedIndex == 0)
            {
                LoadMoreDataCurrentRepairs();

                role = pm.GetRole(email, sqlConnection);
                OutLoadMoreDataCurrentRepairs(role);

                // Создание обычных кнопок
                Button btnPrevPage = new Button();
                btnPrevPage.Text = "Предыдущая страница";
                btnPrevPage.Click += new EventHandler(btnPrevPage_Click);

                Button btnNextPage = new Button();
                btnNextPage.Text = "Следующая страница";
                btnNextPage.Click += new EventHandler(btnNextPage_Click);

                // Добавление кнопок в форму
                this.Controls.Add(btnPrevPage);
                this.Controls.Add(btnNextPage);

                // Размещение кнопок
                // Добавление кнопок в tableLayoutPanel2
                tableLayoutPanel2.Controls.Add(btnPrevPage, 3, 0);
                tableLayoutPanel2.Controls.Add(btnNextPage, 4, 0);

                btnPrevPage.Dock = DockStyle.Fill;
                btnNextPage.Dock = DockStyle.Fill;
            }
            */

            if (tabControl1.SelectedIndex == 0)
            {
                tabControl1.SelectedIndex = 0;
                LoadMoreDataCurrentRepairs();
                role = pm.GetRole(email, sqliteConnection);
                
                timer.Interval = 100;
                timer.Tick += new EventHandler(OnTick);
                timer.Start();

                


                // Создание обычных кнопок
                Button btnPrevPage = new Button();
                btnPrevPage.Text = "Предыдущая страница";
                btnPrevPage.Click += new EventHandler(btnPrevPage_Click);

                Button btnNextPage = new Button();
                btnNextPage.Text = "Следующая страница";
                btnNextPage.Click += new EventHandler(btnNextPage_Click);

                // Добавление кнопок в форму
                this.Controls.Add(btnPrevPage);
                this.Controls.Add(btnNextPage);

                // Размещение кнопок
                // Добавление кнопок в tableLayoutPanel2
                tableLayoutPanel2.Controls.Add(btnPrevPage, 3, 0);
                tableLayoutPanel2.Controls.Add(btnNextPage, 4, 0);

                btnPrevPage.Dock = DockStyle.Fill;
                btnNextPage.Dock = DockStyle.Fill;
            }
            //sqlConnection.Close();
            sqliteConnection.Close();

            Email = email;
        }

        private void OnTick(object sender, EventArgs e)
        {
            OutLoadMoreDataCurrentRepairs(role);
            timer.Stop();
        }
        /*
        private void LoadMoreDataCurrentRepairs()
        {
            // Подключение к базе данных
            using (SqlConnection connection = new SqlConnection(sqlConnection.ConnectionString))
            {
                connection.Open();

                // SQL-запрос для вывода данных из таблицы [current_repairs]
                string query = "SELECT * FROM [current_repairs] ORDER BY id DESC OFFSET @offset ROWS FETCH NEXT @rows ROWS ONLY";

                // Создание команды SQL
                SqlCommand command = new SqlCommand(query, connection);

                // Параметры для SQL-запроса
                command.Parameters.AddWithValue("@offset", offsetCR);
                command.Parameters.AddWithValue("@rows", rowsCR);

                // Выполнение SQL-запроса
                SqlDataReader reader = command.ExecuteReader();

                // Создание таблицы для вывода данных
                DataTable table = new DataTable();

                // Добавление столбцов в таблицу
                table.Columns.Add("id", typeof(int));
                table.Columns.Add("product_code", typeof(string));
                table.Columns.Add("number_of_product", typeof(int));
                table.Columns.Add("delivery", typeof(string));
                table.Columns.Add("elimination", typeof(string));
                table.Columns.Add("date", typeof(DateTime));
                table.Columns.Add("person", typeof(string));
                table.Columns.Add("note", typeof(string));
                table.Columns.Add("role", typeof(int));

                // Вывод данных из SqlDataReader в таблицу
                while (reader.Read())
                {
                    table.Rows.Add(
                        reader["id"],
                        reader["product_code"],
                        reader["number_of_product"],
                        reader["delivery"],
                        reader["elimination"],
                        reader["date"],
                        reader["person"],
                        reader["note"],
                        reader["role"]
                    );
                }

                // Закрытие SqlDataReader
                reader.Close();

                // Вывод таблицы в dataGridView1
                dataGridView1.DataSource = table;

                // Обновление offset для следующей страницы
                offsetCR += rowsCR;
            }
        }*/
        private void LoadMoreDataCurrentRepairs()
        {
            // Подключение к базе данных
            using (SQLiteConnection connection = new SQLiteConnection(ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString))
            {
                connection.Open();

                // SQL-запрос для вывода данных из таблицы [current_repairs]
                string query = "SELECT * FROM current_repairs ORDER BY id DESC LIMIT @rows OFFSET @offset";

                // Создание команды SQL
                SQLiteCommand command = new SQLiteCommand(query, connection);

                // Параметры для SQL-запроса
                command.Parameters.AddWithValue("@offset", offsetCR);
                command.Parameters.AddWithValue("@rows", rowsCR);

                // Выполнение SQL-запроса
                SQLiteDataReader reader = command.ExecuteReader();

                // Создание таблицы для вывода данных
                DataTable table = new DataTable();

                // Добавление столбцов в таблицу
                table.Columns.Add("id", typeof(int));
                table.Columns.Add("product_code", typeof(string));
                table.Columns.Add("number_of_product", typeof(int));
                table.Columns.Add("delivery", typeof(string));
                table.Columns.Add("elimination", typeof(string));
                table.Columns.Add("date", typeof(DateTime));
                table.Columns.Add("person", typeof(string));
                table.Columns.Add("note", typeof(string));
                table.Columns.Add("role", typeof(int));

                // Вывод данных из SQLiteDataReader в таблицу
                while (reader.Read())
                {
                    table.Rows.Add(
                        reader["id"],
                        reader["product_code"],
                        reader["number_of_product"],
                        reader["delivery"],
                        reader["elimination"],
                        reader["date"],
                        reader["person"],
                        reader["note"],
                        reader["role"]
                    );
                }

                // Закрытие SQLiteDataReader
                reader.Close();

                // Вывод таблицы в dataGridView1
                dataGridView1.DataSource = table;

                // Обновление offset для следующей страницы
                offsetCR += rowsCR;
            }
        }
        /*private void LoadMoreDataWarrantyRepair()
        {
            //Подключение к базе данных
            using (SqlConnection connection = new SqlConnection(sqlConnection.ConnectionString))
            {
                connection.Open();

                // SQL-запрос для вывода данных из таблицы [warranty_repair]
                string query = "SELECT * FROM [warranty_repair] ORDER BY id DESC OFFSET @offset ROWS FETCH NEXT @rows ROWS ONLY";

                // Создание команды SQL
                SqlCommand command = new SqlCommand(query, connection);

                // Параметры для SQL-запроса
                command.Parameters.AddWithValue("@offset", offsetWR);
                command.Parameters.AddWithValue("@rows", rowsWR);

                // Выполнение SQL-запроса
                SqlDataReader reader = command.ExecuteReader();

                // Создание таблицы для вывода данных
                DataTable table = new DataTable();

                // Добавление столбцов в таблицу
                table.Columns.Add("id", typeof(int));
                table.Columns.Add("product_code", typeof(string));
                table.Columns.Add("number_of_product", typeof(int));
                table.Columns.Add("year_of_release", typeof(DateTime));
                table.Columns.Add("act_number", typeof(string));
                table.Columns.Add("date", typeof(DateTime));
                table.Columns.Add("person", typeof(string));
                table.Columns.Add("organization", typeof(string));
                table.Columns.Add("note", typeof(string));
                table.Columns.Add("role", typeof(int));

                // Вывод данных из SqlDataReader в таблицу
                while (reader.Read())
                {
                    table.Rows.Add(
                        reader["id"],
                        reader["product_code"],
                        reader["number_of_product"],
                        reader["year_of_release"],
                        reader["act_number"],
                        reader["date"],
                        reader["person"],
                        reader["organization"],
                        reader["note"],
                        reader["role"]
                    );
                }

                // Закрытие SqlDataReader

                reader.Close();

                // Вывод таблицы в dataGridView1
                dataGridView2.DataSource = table;

                // Обновление offset для следующей страницы
                offsetWR += rowsWR;
            }
        }*/
        private void LoadMoreDataWarrantyRepair()
        {
            // Подключение к базе данных
            using (SQLiteConnection connection = new SQLiteConnection(ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString))
            {
                connection.Open();

                // SQL-запрос для вывода данных из таблицы [warranty_repair]
                string query = "SELECT * FROM warranty_repair ORDER BY id DESC LIMIT @rows OFFSET @offset";

                // Создание команды SQL
                SQLiteCommand command = new SQLiteCommand(query, connection);

                // Параметры для SQL-запроса
                command.Parameters.AddWithValue("@offset", offsetWR);
                command.Parameters.AddWithValue("@rows", rowsWR);

                // Выполнение SQL-запроса
                SQLiteDataReader reader = command.ExecuteReader();

                // Создание таблицы для вывода данных
                DataTable table = new DataTable();

                // Добавление столбцов в таблицу
                table.Columns.Add("id", typeof(int));
                table.Columns.Add("product_code", typeof(string));
                table.Columns.Add("number_of_product", typeof(int));
                table.Columns.Add("year_of_release", typeof(DateTime));
                table.Columns.Add("act_number", typeof(string));
                table.Columns.Add("date", typeof(DateTime));
                table.Columns.Add("person", typeof(string));
                table.Columns.Add("organization", typeof(string));
                table.Columns.Add("note", typeof(string));
                table.Columns.Add("role", typeof(int));

                // Вывод данных из SQLiteDataReader в таблицу
                while (reader.Read())
                {
                    table.Rows.Add(
                        reader["id"],
                        reader["product_code"],
                        reader["number_of_product"],
                        reader["year_of_release"],
                        reader["act_number"],
                        reader["date"],
                        reader["person"],
                        reader["organization"],
                        reader["note"],
                        reader["role"]
                    );
                }

                // Закрытие SQLiteDataReader
                reader.Close();

                // Вывод таблицы в dataGridView1
                dataGridView2.DataSource = table;

                // Обновление offset для следующей страницы
                offsetWR += rowsWR;
            }
        }
        /*private void LoadMoreDataOneWeekCheck()
        {
            // Подключение к базе данных
            using (SqlConnection connection = new SqlConnection(sqlConnection.ConnectionString))
            {
                connection.Open();

                // SQL-запрос для вывода данных из таблицы [one_week_check]
                string query = "SELECT * FROM [one_week_check] ORDER BY id DESC OFFSET @offset ROWS FETCH NEXT @rows ROWS ONLY";

                // Создание команды SQL
                SqlCommand command = new SqlCommand(query, connection);

                // Параметры для SQL-запроса
                command.Parameters.AddWithValue("@offset", offsetOW);
                command.Parameters.AddWithValue("@rows", rowsOW);

                // Выполнение SQL-запроса
                SqlDataReader reader = command.ExecuteReader();

                // Создание таблицы для вывода данных
                DataTable table = new DataTable();

                // Добавление столбцов в таблицу
                table.Columns.Add("id", typeof(int));
                table.Columns.Add("product_code", typeof(string));
                table.Columns.Add("number_of_product", typeof(int));
                table.Columns.Add("date", typeof(DateTime));
                table.Columns.Add("date_make", typeof(DateTime));
                table.Columns.Add("corresponds", typeof(string));
                table.Columns.Add("person", typeof(string));
                table.Columns.Add("note", typeof(string));
                table.Columns.Add("role", typeof(int));

                // Вывод данных из SqlDataReader в таблицу
                while (reader.Read())
                {
                    table.Rows.Add(
                        reader["id"],
                        reader["product_code"],
                        reader["number_of_product"],
                        reader["date"],
                        reader["date_make"],
                        reader["corresponds"],
                        reader["person"],
                        reader["note"],
                        reader["role"]
                    );
                }

                // Закрытие SqlDataReader
                reader.Close();

                // Вывод таблицы в dataGridView1
                dataGridView3.DataSource = table;

                // Обновление offset для следующей страницы
                offsetOW += rowsOW;
            }
        }*/
        private void LoadMoreDataOneWeekCheck()
        {
            // Подключение к базе данных
            using (SQLiteConnection connection = new SQLiteConnection(ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString))
            {
                connection.Open();

                // SQL-запрос для вывода данных из таблицы [one_week_check]
                string query = "SELECT * FROM one_week_check ORDER BY id DESC LIMIT @rows OFFSET @offset";

                // Создание команды SQL
                SQLiteCommand command = new SQLiteCommand(query, connection);

                // Параметры для SQL-запроса
                command.Parameters.AddWithValue("@offset", offsetOW);
                command.Parameters.AddWithValue("@rows", rowsOW);

                // Выполнение SQL-запроса
                SQLiteDataReader reader = command.ExecuteReader();

                // Создание таблицы для вывода данных
                DataTable table = new DataTable();

                // Добавление столбцов в таблицу
                table.Columns.Add("id", typeof(int));
                table.Columns.Add("product_code", typeof(string));
                table.Columns.Add("number_of_product", typeof(int));
                table.Columns.Add("date", typeof(DateTime));
                table.Columns.Add("date_make", typeof(DateTime));
                table.Columns.Add("corresponds", typeof(string));
                table.Columns.Add("person", typeof(String));
                table.Columns.Add("note", typeof(String));
                table.Columns.Add("role", typeof(int));

                // Вывод данных из SQLiteDataReader в таблицу
                while (reader.Read())
                {
                    table.Rows.Add(
                        reader["id"],
                        reader["product_code"],
                        reader["number_of_product"],
                        reader["date"],
                        reader["date_make"],
                        reader["corresponds"],
                        reader["person"],
                        reader["note"],
                        reader["role"]
                    );
                }

                // Закрытие SQLiteDataReader
                reader.Close();

                // Вывод таблицы в dataGridView1
                dataGridView3.DataSource = table;

                // Обновление offset для следующей страницы
                offsetOW += rowsOW;
            }
        }

        //

        /*
        private void FilterData(string tableName, string columnName, string filterValue, DataGridView dataGridView, int role)
        {
            if (sqlConnection.State == ConnectionState.Closed)
            {
                sqlConnection.Open();
            }

            dataGridView.DataSource = null;

            SqlDataReader dataReader = null;

            try
            {
                string filter = filterValue; // получаем текст из textbox

                SqlCommand sqlCommand = new SqlCommand(
                    $"SELECT * FROM [{tableName}] WHERE {columnName} LIKE @filter ORDER BY id DESC", sqlConnection);//запрос фильтра на поиск по имени

                sqlCommand.Parameters.AddWithValue("@filter", $"%{filter}%"); // добавляем параметр фильтра

                dataReader = sqlCommand.ExecuteReader();

                DataTable table = new DataTable();

                // Добавление столбцов в таблицу
                for (int i = 0; i < dataReader.FieldCount; i++)
                {
                    table.Columns.Add(dataReader.GetName(i), dataReader.GetFieldType(i));
                }

                // Вывод данных из SqlDataReader в таблицу
                while (dataReader.Read())
                {
                    DataRow row = table.NewRow();
                    for (int i = 0; i < dataReader.FieldCount; i++)
                    {
                        row[i] = dataReader[i];
                    }
                    table.Rows.Add(row);
                }

                // Вывод таблицы в dataGridView
                dataGridView.DataSource = table;

                // Настройка видимости и ширины столбцов
                if (role != 1)
                {
                    for (int i = 0; i < dataGridView.Columns.Count; i++)
                    {
                        if (dataGridView.Columns[i].HeaderText == "id")
                        {
                            dataGridView.Columns[i].Visible = false;
                        }
                        else if (dataGridView.Columns[i].HeaderText == "role")
                        {
                            dataGridView.Columns[i].Visible = false;
                        }
                        else if (dataGridView.Columns[i].HeaderText == "note")
                        {
                            dataGridView.Columns[i].Width = 400;
                            dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < dataGridView.Columns.Count; i++)
                    {
                        if (dataGridView.Columns[i].HeaderText == "note")
                        {
                            dataGridView.Columns[i].Width = 400;
                            dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                        }
                    }
                }

                dataGridView.Dock = DockStyle.Fill;
                dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                dataGridView.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                dataGridView.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;

                dataGridView.RowTemplate.Height = 50; // установить высоту строк

                foreach (DataGridViewColumn column in dataGridView.Columns)
                {
                    column.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                    column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                sqlConnection.Close();
            }
            finally
            {
                if (dataReader != null && !dataReader.IsClosed)
                {
                    dataReader.Close();
                    sqlConnection.Close();
                }
            }
        }*/
        private void FilterData(string tableName, string columnName, string filterValue, DataGridView dataGridView, int role)
        {
            string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                connection.Open();

                dataGridView.DataSource = null;

                SQLiteDataReader dataReader = null;

                try
                {
                    string filter = filterValue; // получаем текст из textbox

                    SQLiteCommand sqlCommand = new SQLiteCommand(
                        $"SELECT * FROM {tableName} WHERE {columnName} LIKE @filter ORDER BY id DESC", connection);//запрос фильтра на поиск по имени

                    sqlCommand.Parameters.AddWithValue("@filter", $"%{filter}%"); // добавляем параметр фильтра

                    dataReader = sqlCommand.ExecuteReader();

                    DataTable table = new DataTable();

                    // Добавление столбцов в таблицу
                    for (int i = 0; i < dataReader.FieldCount; i++)
                    {
                        table.Columns.Add(dataReader.GetName(i), dataReader.GetFieldType(i));
                    }

                    // Вывод данных из SQLiteDataReader в таблицу
                    while (dataReader.Read())
                    {
                        DataRow row = table.NewRow();
                        for (int i = 0; i < dataReader.FieldCount; i++)
                        {
                            row[i] = dataReader[i];
                        }
                        table.Rows.Add(row);
                    }

                    // Вывод таблицы в dataGridView
                    dataGridView.DataSource = table;

                    // Настройка видимости и ширины столбцов
                    if (role != 1)
                    {
                        for (int i = 0; i < dataGridView.Columns.Count; i++)
                        {
                            if (dataGridView.Columns[i].HeaderText == "id")
                            {
                                dataGridView.Columns[i].Visible = false;
                            }
                            else if (dataGridView.Columns[i].HeaderText == "role")
                            {
                                dataGridView.Columns[i].Visible = false;
                            }
                            else if (dataGridView.Columns[i].HeaderText == "note")
                            {
                                dataGridView.Columns[i].Width = 400;
                                dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                            }
                        }
                    }
                    else
                    {
                        for (int i = 0; i < dataGridView.Columns.Count; i++)
                        {
                            if (dataGridView.Columns[i].HeaderText == "note")
                            {
                                dataGridView.Columns[i].Width = 400;
                                dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                            }
                        }
                    }

                    dataGridView.Dock = DockStyle.Fill;
                    dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                    dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                    dataGridView.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                    dataGridView.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;

                    dataGridView.RowTemplate.Height = 50; // установить высоту строк

                    foreach (DataGridViewColumn column in dataGridView.Columns)
                    {
                        column.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                        column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    if (dataReader != null && !dataReader.IsClosed)
                    {
                        dataReader.Close();
                    }
                }
            }
        }
        private void OutLoadMoreDataCurrentRepairs(int role)
        {
            if (role != 1)
            {
                dataGridView1.Columns["product_code"].HeaderText = "Код продукта";
                dataGridView1.Columns["number_of_product"].HeaderText = "П/п № продукта";
                dataGridView1.Columns["delivery"].HeaderText = "Доставка";
                dataGridView1.Columns["elimination"].HeaderText = "Устранение";
                dataGridView1.Columns["date"].HeaderText = "Дата";
                dataGridView1.Columns["person"].HeaderText = "Инженер испытатель";
                dataGridView1.Columns["note"].HeaderText = "Описание причины отказа";

                dataGridView1.Columns["product_code"].Width = 300;
                dataGridView1.Columns["product_code"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                dataGridView1.Columns["note"].Width = 450;
                dataGridView1.Columns["note"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

                dataGridView1.Columns["id"].Visible = false;
                dataGridView1.Columns["role"].Visible = false;

                dataGridView1.Dock = DockStyle.Fill;
                dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                dataGridView1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;

                dataGridView1.RowTemplate.Height = 50; // установить высоту строк

                foreach (DataGridViewColumn column in dataGridView1.Columns)
                {
                    column.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                    column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;
                }
            }
            else
            {
                dataGridView1.Columns["product_code"].HeaderText = "Код продукта";
                dataGridView1.Columns["number_of_product"].HeaderText = "П/п № продукта";
                dataGridView1.Columns["delivery"].HeaderText = "Доставка";
                dataGridView1.Columns["elimination"].HeaderText = "Устранение";
                dataGridView1.Columns["date"].HeaderText = "Дата";
                dataGridView1.Columns["person"].HeaderText = "Инженер испытатель";
                dataGridView1.Columns["note"].HeaderText = "Описание причины отказа";
                dataGridView1.Columns["role"].HeaderText = "Роль в БД";

                dataGridView1.Columns["product_code"].Width = 250;
                dataGridView1.Columns["product_code"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                dataGridView1.Columns["note"].Width = 400;
                dataGridView1.Columns["note"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

                dataGridView1.Dock = DockStyle.Fill;
                dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                dataGridView1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;

                foreach (DataGridViewColumn column in dataGridView1.Columns)
                {
                    column.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                    column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;
                }
            }

            int configId = ConfigManager.GetConfig("current_repairs");
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                int lastId = Convert.ToInt32(row.Cells["id"].Value);
                if (lastId > configId)
                {
                    row.DefaultCellStyle.BackColor = Color.Yellow;
                }
                else
                {
                    row.DefaultCellStyle.BackColor = Color.White;
                }
            }
        }
        private void OutLoadMoreDataWarrantyRepair(int role)
        {
            if (role != 1)
            {
                dataGridView2.Columns["product_code"].HeaderText = "Код продукта";
                dataGridView2.Columns["number_of_product"].HeaderText = "П/п № продукта";
                dataGridView2.Columns["year_of_release"].HeaderText = "Год выпуска";
                dataGridView2.Columns["act_number"].HeaderText = "Номер акта";
                dataGridView2.Columns["date"].HeaderText = "Дата Ремонта";
                dataGridView2.Columns["person"].HeaderText = "Инженер испытатель";
                dataGridView2.Columns["organization"].HeaderText = "Организация";
                dataGridView2.Columns["note"].HeaderText = "Описание причины отказа";

                dataGridView2.Columns["product_code"].Width = 250;
                dataGridView2.Columns["product_code"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                dataGridView2.Columns["note"].Width = 400;
                dataGridView2.Columns["note"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

                dataGridView2.Columns["id"].Visible = false;
                dataGridView2.Columns["role"].Visible = false;

                dataGridView2.Dock = DockStyle.Fill;
                dataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                dataGridView2.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                dataGridView2.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                dataGridView2.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;

                dataGridView2.RowTemplate.Height = 50; // установить высоту строк

                foreach (DataGridViewColumn column in dataGridView2.Columns)
                {
                    column.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                    column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;
                }
            }
            else
            {
                dataGridView2.Columns["product_code"].HeaderText = "Код продукта";
                dataGridView2.Columns["number_of_product"].HeaderText = "П/п № продукта";
                dataGridView2.Columns["year_of_release"].HeaderText = "Год выпуска";
                dataGridView2.Columns["act_number"].HeaderText = "Номер акта";
                dataGridView2.Columns["date"].HeaderText = "Дата";
                dataGridView2.Columns["person"].HeaderText = "Инженер испытатель";
                dataGridView2.Columns["organization"].HeaderText = "Организация";
                dataGridView2.Columns["note"].HeaderText = "Описание причины отказа";
                dataGridView2.Columns["role"].HeaderText = "Роль в БД";

                dataGridView2.Columns["product_code"].Width = 200;
                dataGridView2.Columns["product_code"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                dataGridView2.Columns["note"].Width = 350;
                dataGridView2.Columns["note"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

                dataGridView2.Dock = DockStyle.Fill;
                dataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                dataGridView2.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                dataGridView2.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                dataGridView2.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;

                foreach (DataGridViewColumn column in dataGridView2.Columns)
                {
                    column.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                    column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;
                }
            }

            int configId = ConfigManager.GetConfig("warranty_repair");
            foreach (DataGridViewRow row in dataGridView2.Rows)
            {
                int lastId = Convert.ToInt32(row.Cells["id"].Value);
                if (lastId > configId)
                {
                    row.DefaultCellStyle.BackColor = Color.Yellow;
                }
                else
                {
                    row.DefaultCellStyle.BackColor = Color.White;
                }
            }
        }
        private void OutLoadMoreDataOneWeekCheck(int role)
        {
            if (role != 1)
            {
                dataGridView3.Columns["product_code"].HeaderText = "Код продукта";
                dataGridView3.Columns["number_of_product"].HeaderText = "П/п № продукта";
                dataGridView3.Columns["date"].HeaderText = "Дата выполнения проверки";
                dataGridView3.Columns["date_make"].HeaderText = "Дата изготовления";
                dataGridView3.Columns["corresponds"].HeaderText = "Соответствует";
                dataGridView3.Columns["person"].HeaderText = "Инженер испытатель";
                dataGridView3.Columns["note"].HeaderText = "Описание причины отказа";

                dataGridView3.Columns["product_code"].Width = 250;
                dataGridView3.Columns["product_code"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                dataGridView3.Columns["note"].Width = 400;
                dataGridView3.Columns["note"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

                dataGridView3.Columns["id"].Visible = false;
                dataGridView3.Columns["role"].Visible = false;

                dataGridView3.Dock = DockStyle.Fill;
                dataGridView3.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                dataGridView3.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                dataGridView3.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                dataGridView3.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;

                dataGridView3.RowTemplate.Height = 50; // установить высоту строк

                foreach (DataGridViewColumn column in dataGridView3.Columns)
                {
                    column.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                    column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;
                }
            }
            else
            {
                dataGridView3.Columns["product_code"].HeaderText = "Код продукта";
                dataGridView3.Columns["number_of_product"].HeaderText = "П/п № продукта";
                dataGridView3.Columns["date"].HeaderText = "Дата выполнения проверки";
                dataGridView3.Columns["date_make"].HeaderText = "Дата изготовления";
                dataGridView3.Columns["corresponds"].HeaderText = "Соответствует";
                dataGridView3.Columns["person"].HeaderText = "Инженер испытатель";
                dataGridView3.Columns["note"].HeaderText = "Примечание";
                dataGridView3.Columns["role"].HeaderText = "Роль в БД";

                dataGridView3.Columns["product_code"].Width = 200;
                dataGridView3.Columns["product_code"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                dataGridView3.Columns["note"].Width = 350;
                dataGridView3.Columns["note"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

                dataGridView3.Dock = DockStyle.Fill;
                dataGridView3.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                dataGridView3.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                dataGridView3.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                dataGridView3.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;

                foreach (DataGridViewColumn column in dataGridView3.Columns)
                {
                    column.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                    column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;
                }
            }

            int configId = ConfigManager.GetConfig("one_week_check");
            foreach (DataGridViewRow row in dataGridView3.Rows)
            {
                int lastId = Convert.ToInt32(row.Cells["id"].Value);
                if (lastId > configId)
                {
                    row.DefaultCellStyle.BackColor = Color.Yellow;
                }
                else
                {
                    row.DefaultCellStyle.BackColor = Color.White;
                }
            }
        }
        private void ResetFilter(int tabIndex, int role)
        {
            if (tabIndex == 0)
            {
                offsetCR = 0;
                LoadMoreDataCurrentRepairs();
                OutLoadMoreDataCurrentRepairs(role);
            }
            else if (tabIndex == 1)
            {
                offsetWR = 0;
                LoadMoreDataWarrantyRepair();
                OutLoadMoreDataWarrantyRepair(role);
            }
            else if (tabIndex == 2)
            {
                offsetOW = 0;
                LoadMoreDataOneWeekCheck();
                OutLoadMoreDataOneWeekCheck(role);
            }
        }

        // Изменение базы данных с помощью таблицы current_repairs
        /*
        private void UpdateCurrentRepairs(int rowIndex, int columnIndex, int role)
        {
            if (role < 3)
            {
                try
                {
                    // Открываем связь с БД
                    sqlConnection.Open();

                    // Получаем новое значение
                    string newValue = dataGridView1.Rows[rowIndex].Cells[columnIndex].Value.ToString();

                    // Получаем идентификатор пользователя, который был изменен
                    string idValue = dataGridView1.Rows[rowIndex].Cells[0].Value.ToString();

                    // Обновляем базу данных с новыми данными
                    SqlCommand command = new SqlCommand(
                    "UPDATE current_repairs SET [" + dataGridView1.Columns[columnIndex].Name + "] = @newValue WHERE id = @idValue",
                    sqlConnection);
                    command.Parameters.AddWithValue("@newValue", newValue);
                    command.Parameters.AddWithValue("@idValue", idValue);
                    command.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    Console.WriteLine("Ошибка: " + ex.Message);
                }
                finally
                {
                    // Закрываем связь с БД
                    sqlConnection.Close();
                }
            }
            else
            {
                MessageBox.Show("Изменение БД Вам не доступно! Обратитесь к Администратору...");
            }
        }*/
        private void UpdateCurrentRepairs(int rowIndex, int columnIndex, int role)
        {
            if (role < 3)
            {
                try
                {
                    // Открываем связь с БД
                    string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
                    using (SQLiteConnection connection = new SQLiteConnection(connectionString))
                    {
                        connection.Open();

                        // Получаем новое значение
                        string newValue = dataGridView1.Rows[rowIndex].Cells[columnIndex].Value.ToString();

                        // Получаем идентификатор пользователя, который был изменен
                        string idValue = dataGridView1.Rows[rowIndex].Cells[0].Value.ToString();

                        // Обновляем базу данных с новыми данными
                        SQLiteCommand command = new SQLiteCommand(
                        "UPDATE current_repairs SET " + dataGridView1.Columns[columnIndex].Name + " = @newValue WHERE id = @idValue",
                        connection);
                        command.Parameters.AddWithValue("@newValue", newValue);
                        command.Parameters.AddWithValue("@idValue", idValue);
                        command.ExecuteNonQuery();
                    }
                }
                catch (SQLiteException ex)
                {
                    Console.WriteLine("Ошибка: " + ex.Message);
                }
            }
            else
            {
                MessageBox.Show("Изменение БД Вам не доступно! Обратитесь к Администратору...");
            }
        }
        // Изменение базы данных с помощью таблицы warranty_repair
        /*
        private void UpdateWarrantyRepair(int rowIndex, int columnIndex, int role)
        {
            if (role < 3)
            {
                try
                {
                    // Открываем связь с БД
                    sqlConnection.Open();

                    // Получаем новое значение
                    string newValue = dataGridView2.Rows[rowIndex].Cells[columnIndex].Value.ToString();

                    // Получаем идентификатор пользователя, который был изменен
                    string idValue = dataGridView2.Rows[rowIndex].Cells[0].Value.ToString();

                    // Обновляем базу данных с новыми данными
                    SqlCommand command = new SqlCommand(
                    "UPDATE warranty_repair SET [" + dataGridView2.Columns[columnIndex].Name + "] = @newValue WHERE id = @idValue",
                    sqlConnection);
                    command.Parameters.AddWithValue("@newValue", newValue);
                    command.Parameters.AddWithValue("@idValue", idValue);
                    command.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    Console.WriteLine("Ошибка: " + ex.Message);
                }
                finally
                {
                    // Закрываем связь с БД
                    sqlConnection.Close();
                }
            }
            else
            {
                MessageBox.Show("Изменение БД Вам не доступно! Обратитесь к Администратору...");
            }
        }*/
        private void UpdateWarrantyRepair(int rowIndex, int columnIndex, int role)
        {
            if (role < 3)
            {
                try
                {
                    // Открываем связь с БД
                    string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
                    using (SQLiteConnection connection = new SQLiteConnection(connectionString))
                    {
                        connection.Open();

                        // Получаем новое значение
                        string newValue = dataGridView2.Rows[rowIndex].Cells[columnIndex].Value.ToString();

                        // Получаем идентификатор пользователя, который был изменен
                        string idValue = dataGridView2.Rows[rowIndex].Cells[0].Value.ToString();

                        // Обновляем базу данных с новыми данными
                        SQLiteCommand command = new SQLiteCommand(
                        "UPDATE warranty_repair SET " + dataGridView2.Columns[columnIndex].Name + " = @newValue WHERE id = @idValue",
                        connection);
                        command.Parameters.AddWithValue("@newValue", newValue);
                        command.Parameters.AddWithValue("@idValue", idValue);
                        command.ExecuteNonQuery();
                    }
                }
                catch (SQLiteException ex)
                {
                    Console.WriteLine("Ошибка: " + ex.Message);
                }
            }
            else
            {
                MessageBox.Show("Изменение БД Вам не доступно! Обратитесь к Администратору...");
            }
        }
        // Изменение базы данных с помощью таблицы one_week_check
        /*
        private void UpdateOneWeekCheck(int rowIndex, int columnIndex, int role)
        {
            if (role < 3)
            {
                try
                {
                    // Открываем связь с БД
                    sqlConnection.Open();

                    // Получаем новое значение
                    string newValue = dataGridView3.Rows[rowIndex].Cells[columnIndex].Value.ToString();

                    // Получаем идентификатор пользователя, который был изменен
                    string idValue = dataGridView3.Rows[rowIndex].Cells[0].Value.ToString();

                    // Обновляем базу данных с новыми данными
                    SqlCommand command = new SqlCommand(
                    "UPDATE one_week_check SET [" + dataGridView3.Columns[columnIndex].Name + "] = @newValue WHERE id = @idValue",
                    sqlConnection);
                    command.Parameters.AddWithValue("@newValue", newValue);
                    command.Parameters.AddWithValue("@idValue", idValue);
                    command.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    Console.WriteLine("Ошибка: " + ex.Message);
                }
                finally
                {
                    // Закрываем связь с БД
                    sqlConnection.Close();
                }
            }
            else
            {
                MessageBox.Show("Изменение БД Вам не доступно! Обратитесь к Администратору...");
            }
        }*/
        private void UpdateOneWeekCheck(int rowIndex, int columnIndex, int role)
        {
            if (role < 3)
            {
                try
                {
                    // Открываем связь с БД
                    string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
                    using (SQLiteConnection connection = new SQLiteConnection(connectionString))
                    {
                        connection.Open();

                        // Получаем новое значение
                        string newValue = dataGridView3.Rows[rowIndex].Cells[columnIndex].Value.ToString();

                        // Получаем идентификатор пользователя, который был изменен
                        string idValue = dataGridView3.Rows[rowIndex].Cells[0].Value.ToString();

                        // Обновляем базу данных с новыми данными
                        SQLiteCommand command = new SQLiteCommand(
                        "UPDATE one_week_check SET " + dataGridView3.Columns[columnIndex].Name + " = @newValue WHERE id = @idValue",
                        connection);
                        command.Parameters.AddWithValue("@newValue", newValue);
                        command.Parameters.AddWithValue("@idValue", idValue);
                        command.ExecuteNonQuery();
                    }
                }
                catch (SQLiteException ex)
                {
                    Console.WriteLine("Ошибка: " + ex.Message);
                }
            }
            else
            {
                MessageBox.Show("Изменение БД Вам не доступно! Обратитесь к Администратору...");
            }
        }
        // Удаление из базы данных с помощью таблицы current_repairs
        /*
        private void DeleteCurrentRepairs(int rowIndex, int role)
        {
            if(role < 3)
            {
                try
                {
                    //Открываем связь с БД
                    sqlConnection.Open();

                    // Получаем идентификатор пользователя, который должен быть удален
                    string idValue = dataGridView1.Rows[rowIndex].Cells[0].Value.ToString();

                    //Удаляем запись БД
                    SqlCommand command = new SqlCommand(
                        "DELETE FROM current_repairs WHERE id = @idValue",
                        sqlConnection);
                    command.Parameters.AddWithValue("@idValue", idValue);
                    command.ExecuteNonQuery();
                }
                catch(Exception ex)
                {
                    MessageBox.Show("Ошибка " + ex.Message);
                }
                finally
                {
                    // Закрываем связь с БД
                    sqlConnection.Close();
                }
            }
            else
            {
                MessageBox.Show("Изменение БД Вам не доступно! Обратитесь к Администратору...");
            }
        }*/
        private void DeleteCurrentRepairs(int rowIndex, int role)
        {
            if (role < 3)
            {
                try
                {
                    // Открываем связь с БД
                    string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
                    using (SQLiteConnection connection = new SQLiteConnection(connectionString))
                    {
                        connection.Open();

                        // Получаем идентификатор пользователя, который должен быть удален
                        string idValue = dataGridView1.Rows[rowIndex].Cells[0].Value.ToString();

                        // Удаляем запись БД
                        SQLiteCommand command = new SQLiteCommand(
                            "DELETE FROM current_repairs WHERE id = @idValue",
                            connection);
                        command.Parameters.AddWithValue("@idValue", idValue);
                        command.ExecuteNonQuery();
                    }
                }
                catch (SQLiteException ex)
                {
                    MessageBox.Show("Ошибка " + ex.Message);
                }
            }
            else
            {
                MessageBox.Show("Изменение БД Вам не доступно! Обратитесь к Администратору...");
            }
        }
        /*
        private void DeleteWarrantyRepair(int rowIndex, int role)
        {
            if (role < 3)
            {
                try
                {
                    //Открываем связь с БД
                    sqlConnection.Open();

                    // Получаем идентификатор пользователя, который должен быть удален
                    string idValue = dataGridView2.Rows[rowIndex].Cells[0].Value.ToString();

                    //Удаляем запись БД
                    SqlCommand command = new SqlCommand(
                        "DELETE FROM warranty_repair WHERE id = @idValue",
                        sqlConnection);
                    command.Parameters.AddWithValue("@idValue", idValue);
                    command.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Ошибка " + ex.Message);
                }
                finally
                {
                    // Закрываем связь с БД
                    sqlConnection.Close();
                }
            }
            else
            {
                MessageBox.Show("Изменение БД Вам не доступно! Обратитесь к Администратору...");
            }
        }*/
        private void DeleteWarrantyRepair(int rowIndex, int role)
        {
            if (role < 3)
            {
                try
                {
                    // Открываем связь с БД
                    string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
                    using (SQLiteConnection connection = new SQLiteConnection(connectionString))
                    {
                        connection.Open();

                        // Получаем идентификатор пользователя, который должен быть удален
                        string idValue = dataGridView2.Rows[rowIndex].Cells[0].Value.ToString();

                        // Удаляем запись БД
                        SQLiteCommand command = new SQLiteCommand(
                            "DELETE FROM warranty_repair WHERE id = @idValue",
                            connection);
                        command.Parameters.AddWithValue("@idValue", idValue);
                        command.ExecuteNonQuery();
                    }
                }
                catch (SQLiteException ex)
                {
                    MessageBox.Show("Ошибка " + ex.Message);
                }
            }
            else
            {
                MessageBox.Show("Изменение БД Вам не доступно! Обратитесь к Администратору...");
            }
        }
        /*
        private void DeleteOneWeekCheck(int rowIndex, int role)
        {
            if (role < 3)
            {
                try
                {
                    //Открываем связь с БД
                    sqlConnection.Open();

                    // Получаем идентификатор пользователя, который должен быть удален
                    string idValue = dataGridView3.Rows[rowIndex].Cells[0].Value.ToString();

                    //Удаляем запись БД
                    SqlCommand command = new SqlCommand(
                        "DELETE FROM one_week_check WHERE id = @idValue",
                        sqlConnection);
                    command.Parameters.AddWithValue("@idValue", idValue);
                    command.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Ошибка " + ex.Message);
                }
                finally
                {
                    // Закрываем связь с БД
                    sqlConnection.Close();
                }
            }
            else
            {
                MessageBox.Show("Изменение БД Вам не доступно! Обратитесь к Администратору...");
            }
        }*/
        private void DeleteOneWeekCheck(int rowIndex, int role)
        {
            if (role < 3)
            {
                try
                {
                    // Открываем связь с БД
                    string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
                    using (SQLiteConnection connection = new SQLiteConnection(connectionString))
                    {
                        connection.Open();

                        // Получаем идентификатор пользователя, который должен быть удален
                        string idValue = dataGridView3.Rows[rowIndex].Cells[0].Value.ToString();

                        // Удаляем запись БД
                        SQLiteCommand command = new SQLiteCommand(
                            "DELETE FROM one_week_check WHERE id = @idValue",
                            connection);
                        command.Parameters.AddWithValue("@idValue", idValue);
                        command.ExecuteNonQuery();
                    }
                }
                catch (SQLiteException ex)
                {
                    MessageBox.Show("Ошибка " + ex.Message);
                }
            }
            else
            {
                MessageBox.Show("Изменение БД Вам не доступно! Обратитесь к Администратору...");
            }
        }

        /*
        private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
            {
                using (SqlConnection connection = new SqlConnection(sqlConnection.ConnectionString))
                {
                    connection.Open();
                    int role = pm.GetRole(Email, connection);
                    DataGridView dataGridView = (DataGridView)sender;
                    if (dataGridView == dataGridView1)
                    {
                        UpdateCurrentRepairs(e.RowIndex, e.ColumnIndex, role);
                        OutLoadMoreDataCurrentRepairs(role);
                    }
                    else if (dataGridView == dataGridView2)
                    {
                        UpdateWarrantyRepair(e.RowIndex, e.ColumnIndex, role);
                        OutLoadMoreDataWarrantyRepair(role);
                    }
                    else if (dataGridView == dataGridView3)
                    {
                        UpdateOneWeekCheck(e.RowIndex, e.ColumnIndex, role);
                        OutLoadMoreDataOneWeekCheck(role);
                    }
                }
            }
        }*/
        private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
            {
                string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
                using (SQLiteConnection connection = new SQLiteConnection(connectionString))
                {
                    connection.Open();
                    int role = pm.GetRole(Email, connection);
                    DataGridView dataGridView = (DataGridView)sender;
                    if (dataGridView == dataGridView1)
                    {
                        UpdateCurrentRepairs(e.RowIndex, e.ColumnIndex, role);
                        OutLoadMoreDataCurrentRepairs(role);
                    }
                    else if (dataGridView == dataGridView2)
                    {
                        UpdateWarrantyRepair(e.RowIndex, e.ColumnIndex, role);
                        OutLoadMoreDataWarrantyRepair(role);
                    }
                    else if (dataGridView == dataGridView3)
                    {
                        UpdateOneWeekCheck(e.RowIndex, e.ColumnIndex, role);
                        OutLoadMoreDataOneWeekCheck(role);
                    }
                }
            }
        }
        /*
        private void DataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                DataGridView dgv = (DataGridView)sender;

                if (dgv.SelectedRows.Count > 0)
                {
                    using (SqlConnection connection = new SqlConnection(sqlConnection.ConnectionString))
                    {
                        connection.Open();

                        int rowIndex = dgv.SelectedRows[0].Index;

                        if (dgv == dataGridView1)
                        {
                            DeleteCurrentRepairs(rowIndex, pm.GetRole(Email, connection));
                            OutLoadMoreDataCurrentRepairs(pm.GetRole(Email, connection));
                        }
                        else if (dgv == dataGridView2)
                        {
                            DeleteWarrantyRepair(rowIndex, pm.GetRole(Email, connection));
                            OutLoadMoreDataWarrantyRepair(pm.GetRole(Email, connection));
                        }
                        else if (dgv == dataGridView3)
                        {
                            DeleteOneWeekCheck(rowIndex, pm.GetRole(Email, connection));
                            OutLoadMoreDataOneWeekCheck(pm.GetRole(Email, connection));
                        }
                    }
                }
            }
        }*/
        private void DataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                DataGridView dgv = (DataGridView)sender;

                if (dgv.SelectedRows.Count > 0)
                {
                    string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
                    using (SQLiteConnection connection = new SQLiteConnection(connectionString))
                    {
                        connection.Open();

                        int rowIndex = dgv.SelectedRows[0].Index;

                        if (dgv == dataGridView1)
                        {
                            DeleteCurrentRepairs(rowIndex, pm.GetRole(Email, connection));
                            OutLoadMoreDataCurrentRepairs(pm.GetRole(Email, connection));
                        }
                        else if (dgv == dataGridView2)
                        {
                            DeleteWarrantyRepair(rowIndex, pm.GetRole(Email, connection));
                            OutLoadMoreDataWarrantyRepair(pm.GetRole(Email, connection));
                        }
                        else if (dgv == dataGridView3)
                        {
                            DeleteOneWeekCheck(rowIndex, pm.GetRole(Email, connection));
                            OutLoadMoreDataOneWeekCheck(pm.GetRole(Email, connection));
                        }
                    }
                }
            }
        }

        private void SaveTableDataGridView(DataGridView dataGridView)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "Текстовый файл (*.txt)|*.txt";
            saveFileDialog.FileName = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".txt";

            if(saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                string filePath = saveFileDialog.FileName;

                using (StreamWriter writer = new StreamWriter(filePath))
                {
                    for(int i = 1; i < dataGridView.Columns.Count - 1; i++)
                    {
                        writer.Write(dataGridView.Columns[i].HeaderText + "\t");
                    }
                    writer.WriteLine();

                    foreach(DataGridViewRow row in dataGridView.Rows)
                    {
                        for(int i = 1; i < row.Cells.Count - 1; i++)
                        {
                            writer.Write(Convert.ToString(row.Cells[i].Value) + "\t");
                        }
                        writer.WriteLine();
                    }
                }
                MessageBox.Show("Файл сохранен успешно!", "Сохранение файла", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        public class DataGridViewPrinter : PrintDocument
        {
            private DataGridView dataGridView;
            private int currentPage = 0; // Глобальная переменная для хранения текущей страницы
            private int startRow = 0; // Глобальная переменная для хранения начальной строки на текущей странице

            public DataGridViewPrinter(DataGridView dataGridView)
            {
                this.dataGridView = dataGridView;

                // Установка ориентации страницы в альбом
                DefaultPageSettings.Landscape = true;

                // Установка полей страницы
                DefaultPageSettings.Margins = new Margins(30, 10, 10, 10); // Поля в пикселях (слева, справа, сверху, снизу)
            }

            protected override void OnPrintPage(PrintPageEventArgs e)
            {
                Graphics graphics = e.Graphics;
                Font font = new Font("Arial", 8);

                Console.WriteLine($"Starting page {currentPage + 1} with startRow: {startRow}");

                // Печать хедаров столбцов
                int x = 30;
                int yHeaders = 25;
                int headersHeight = 40; // Высота заголовков

                // Рисуем бледно-синий фон для заголовков
                graphics.FillRectangle(Brushes.LightBlue, new RectangleF(x, yHeaders, dataGridView.Columns.GetColumnsWidth(DataGridViewElementStates.Visible), headersHeight));

                foreach (DataGridViewColumn column in dataGridView.Columns)
                {
                    if (column.Visible)
                    {
                        StringFormat stringFormat = new StringFormat();
                        stringFormat.FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.LineLimit;
                        graphics.DrawString(column.HeaderText, font, Brushes.Black, new RectangleF(x, yHeaders, column.Width, headersHeight), stringFormat);
                        x += column.Width + 5; // добавляем ширину столбца и 5 пикселей между столбцами
                        if (x > 800) // задаем максимальную ширину для строк
                        {
                            x = 10;
                            yHeaders += headersHeight; // задаем расстояние между строками
                        }
                    }
                }

                // Печать данных
                int yData = yHeaders + 10;
                int endRow = Math.Min(startRow + GetRowsPerPage(e), dataGridView.Rows.Count);

                for (int i = startRow; i < endRow; i++)
                {
                    DataGridViewRow row = dataGridView.Rows[i];
                    x = 30;
                    int yRow = yData; // отдельная переменная для текущей строки
                    int xRow = x; // отдельная переменная для текущей строки
                    int rowHeight = 0;

                    // Определяем цвет фона для текущей строки
                    Brush backgroundColor = (i % 2 == 0) ? Brushes.LightYellow : Brushes.LightGreen;

                    // Рисуем фон строки
                    graphics.FillRectangle(backgroundColor, new RectangleF(x, yRow, dataGridView.Columns.GetColumnsWidth(DataGridViewElementStates.Visible), 40));
                    Console.WriteLine($"Row {i} background color: {backgroundColor}");

                    foreach (DataGridViewCell cell in row.Cells)
                    {
                        if (cell.OwningColumn.Visible)
                        {
                            StringFormat stringFormat = new StringFormat();
                            stringFormat.FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.LineLimit | StringFormatFlags.NoClip;
                            stringFormat.LineAlignment = StringAlignment.Center;
                            stringFormat.Alignment = StringAlignment.Near;
                            stringFormat.Trimming = StringTrimming.Word;

                            // Измеряем высоту текста с учетом переноса строк
                            SizeF stringSize = graphics.MeasureString(Convert.ToString(cell.Value), font, new SizeF(cell.OwningColumn.Width, 1000), stringFormat);
                            rowHeight = Math.Max(rowHeight, (int)stringSize.Height + 5); // добавляем 5 пикселей для отступа
                            graphics.DrawString(Convert.ToString(cell.Value), font, Brushes.Black, new RectangleF(xRow, yRow, cell.OwningColumn.Width, rowHeight), stringFormat);
                            xRow += cell.OwningColumn.Width + 5; // добавляем ширину столбца и 5 пикселей между столбцами
                        }
                    }

                    // Проверка, не выходит ли текущая строка за пределы страницы
                    if (yData + rowHeight > e.MarginBounds.Height - 25)
                    {
                        startRow = i; // Обновляем начальную строку для следующей страницы
                        e.HasMorePages = (i < dataGridView.Rows.Count - 1);
                        Console.WriteLine($"Page {currentPage + 1} ended at row {i}. HasMorePages: {e.HasMorePages}");
                        return;
                    }

                    yData += rowHeight; // добавляем высоту строки
                }

                // Если данные закончились, но есть еще страницы
                if (endRow < dataGridView.Rows.Count)
                {
                    e.HasMorePages = true;
                    currentPage++;
                    Console.WriteLine($"Page {currentPage + 1} started at row {endRow}. HasMorePages: {e.HasMorePages}");
                }
                else
                {
                    e.HasMorePages = false;
                    Console.WriteLine($"Last page {currentPage + 1} ended at row {endRow}. HasMorePages: {e.HasMorePages}");
                }
            }

            private int GetRowsPerPage(PrintPageEventArgs e)
            {
                int availableHeight = e.MarginBounds.Height - 30; // 30 пикселей для заголовков и отступов
                int rowsPerPage = 0;
                int currentHeight = 0;

                for (int i = startRow; i < dataGridView.Rows.Count; i++)
                {
                    DataGridViewRow row = dataGridView.Rows[i];
                    int rowHeight = 0;

                    foreach (DataGridViewCell cell in row.Cells)
                    {
                        if (cell.OwningColumn.Visible)
                        {
                            StringFormat stringFormat = new StringFormat();
                            stringFormat.FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.LineLimit | StringFormatFlags.NoClip;
                            stringFormat.LineAlignment = StringAlignment.Center;
                            stringFormat.Alignment = StringAlignment.Near;
                            stringFormat.Trimming = StringTrimming.Word;

                            // Измеряем высоту текста с учетом переноса строк
                            SizeF stringSize = e.Graphics.MeasureString(Convert.ToString(cell.Value), new Font("Arial", 8), new SizeF(cell.OwningColumn.Width, 1000), stringFormat);
                            rowHeight = Math.Max(rowHeight, (int)stringSize.Height + 5); // добавляем 5 пикселей для отступа
                        }
                    }

                    if (currentHeight + rowHeight > availableHeight)
                    {
                        break;
                    }

                    currentHeight += rowHeight;
                    rowsPerPage++;
                }

                return rowsPerPage;
            }

            public void ResetCurrentPage()
            {
                currentPage = 0; // Сбрасываем текущую страницу перед началом печати
                startRow = 0; // Сбрасываем начальную строку перед началом печати
            }
        }

        private void PrintTableDataGridView(DataGridView dataGridView)
        {
            DataGridViewPrinter printDocument = new DataGridViewPrinter(dataGridView);

            PrintDialog printDialog = new PrintDialog();
            printDialog.Document = printDocument;

            if (printDialog.ShowDialog() == DialogResult.OK)
            {
                printDocument.ResetCurrentPage(); // Сбрасываем текущую страницу перед началом печати
                printDocument.Print();
            }
        }





        /*
        private List<Tuple<string, string>> GetCollection(int tabIndex)
        {
            List<Tuple<string, string>> collection = new List<Tuple<string, string>>();

            switch (tabIndex)
            {
                case 0:
                    collection.Add(Tuple.Create("По Коду продукта", "product_code"));
                    collection.Add(Tuple.Create("По № п/п продукта", "number_of_product"));
                    collection.Add(Tuple.Create("По Дате ремонта", "FORMAT(date, 'dd.MM.yyyy')"));
                    break;
                case 1:
                    collection.Add(Tuple.Create("По Коду продукта", "product_code"));
                    collection.Add(Tuple.Create("По № п/п продукта", "number_of_product"));
                    collection.Add(Tuple.Create("По Году выпуска", "FORMAT(year_of_release, 'dd.MM.yyyy')"));
                    collection.Add(Tuple.Create("По Номеру Акта", "act_number"));
                    collection.Add(Tuple.Create("По Названию организации", "organization"));
                    collection.Add(Tuple.Create("По Дате ремонта", "FORMAT(date, 'dd.MM.yyyy')"));
                    break;
                case 2:
                    collection.Add(Tuple.Create("По Коду продукта", "product_code"));
                    collection.Add(Tuple.Create("По № п/п продукта", "number_of_product"));
                    collection.Add(Tuple.Create("По Дате изготовления", "FORMAT(date_make, 'dd.MM.yyyy')"));
                    break;
            }

            return collection;
        }*/
        private List<Tuple<string, string>> GetCollection(int tabIndex)
        {
            List<Tuple<string, string>> collection = new List<Tuple<string, string>>();

            switch (tabIndex)
            {
                case 0:
                    collection.Add(Tuple.Create("По Коду продукта", "product_code"));
                    collection.Add(Tuple.Create("По № п/п продукта", "number_of_product"));
                    collection.Add(Tuple.Create("По Дате ремонта", "strftime('%d.%m.%Y', date)"));
                    break;
                case 1:
                    collection.Add(Tuple.Create("По Коду продукта", "product_code"));
                    collection.Add(Tuple.Create("По № п/п продукта", "number_of_product"));
                    collection.Add(Tuple.Create("По Году выпуска", "strftime('%d.%m.%Y', year_of_release)"));
                    collection.Add(Tuple.Create("По Номеру Акта", "act_number"));
                    collection.Add(Tuple.Create("По Названию организации", "organization"));
                    collection.Add(Tuple.Create("По Дате ремонта", "strftime('%d.%m.%Y', date)"));
                    break;
                case 2:
                    collection.Add(Tuple.Create("По Коду продукта", "product_code"));
                    collection.Add(Tuple.Create("По № п/п продукта", "number_of_product"));
                    collection.Add(Tuple.Create("По Дате изготовления", "strftime('%d.%m.%Y', date_make)"));
                    break;
            }

            return collection;
        }
        private string GetColumnName(int tabIndex, string selectedValue)
        {
            List<Tuple<string, string>> collection = GetCollection(tabIndex);
            return collection.FirstOrDefault(x => x.Item1 == selectedValue).Item2;
        }

        
        //отображение дополнений в БД
        public class ConfigManager
        {
            private static readonly string ConfigFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "ProductDB");
            private static readonly string ConfigFilePath = Path.Combine(ConfigFolder, "config.xml");

            private const string TableName1 = "current_repairs";
            private const string TableName2 = "warranty_repair";
            private const string TableName3 = "one_week_check";

            public static void SaveConfig(int id1, int id2, int id3)
            {
                XmlDocument xmlDoc = new XmlDocument();
                if (!Directory.Exists(ConfigFolder))
                {
                    Directory.CreateDirectory(ConfigFolder);
                }

                if (File.Exists(ConfigFilePath))
                {
                    xmlDoc.Load(ConfigFilePath);
                }
                else
                {
                    xmlDoc.AppendChild(xmlDoc.CreateElement("config"));
                }

                XmlNode root = xmlDoc.DocumentElement;
                if (root.SelectSingleNode($"//{TableName1}") == null)
                {
                    root.AppendChild(xmlDoc.CreateElement(TableName1));
                }
                if (root.SelectSingleNode($"//{TableName2}") == null)
                {
                    root.AppendChild(xmlDoc.CreateElement(TableName2));
                }
                if (root.SelectSingleNode($"//{TableName3}") == null)
                {
                    root.AppendChild(xmlDoc.CreateElement(TableName3));
                }

                root.SelectSingleNode($"//{TableName1}").InnerText = id1.ToString();
                root.SelectSingleNode($"//{TableName2}").InnerText = id2.ToString();
                root.SelectSingleNode($"//{TableName3}").InnerText = id3.ToString();

                xmlDoc.Save(ConfigFilePath);
            }

            public static int GetConfig(string tableName)
            {
                XmlDocument xmlDoc = new XmlDocument();
                if (!Directory.Exists(ConfigFolder))
                {
                    return 0;
                }

                if (File.Exists(ConfigFilePath))
                {
                    xmlDoc.Load(ConfigFilePath);
                }
                else
                {
                    return 0;
                }

                XmlNode node = xmlDoc.DocumentElement.SelectSingleNode($"//{tableName}");
                if (node != null)
                {
                    return int.Parse(node.InnerText);
                }
                else
                {
                    return 0;
                }
            }
        }
        private int GetLastId(SQLiteConnection connection, string tableName)
        {
            // SQL-запрос для вывода последнего id из таблицы
            string query = $"SELECT MAX(id) FROM {tableName}";

            // Создание команды SQL
            SQLiteCommand command = new SQLiteCommand(query, connection);

            // Выполнение SQL-запроса
            object result = command.ExecuteScalar();

            if (result != null)
            {
                return Convert.ToInt32(result);
            }
            else
            {
                return 0;
            }

        }


        /*
        private void btnPrevPage_Click(object sender, EventArgs e)
        {
            if (tabControl1.SelectedIndex == 0)
            {
                if (offsetCR > 0)
                {
                    int oldOffset = offsetCR;
                    offsetCR -= rowsCR;
                    DataTable table = new DataTable();
                    using (SqlConnection connection = new SqlConnection(sqlConnection.ConnectionString))
                    {
                        connection.Open();
                        string query = "SELECT * FROM [current_repairs] ORDER BY id DESC OFFSET @offset ROWS FETCH NEXT @rows ROWS ONLY";
                        SqlCommand command = new SqlCommand(query, connection);
                        command.Parameters.AddWithValue("@offset", offsetCR);
                        command.Parameters.AddWithValue("@rows", rowsCR);
                        SqlDataReader reader = command.ExecuteReader();
                        table.Columns.Add("id", typeof(int));
                        table.Columns.Add("product_code", typeof(string));
                        table.Columns.Add("number_of_product", typeof(int));
                        table.Columns.Add("delivery", typeof(string));
                        table.Columns.Add("elimination", typeof(string));
                        table.Columns.Add("date", typeof(DateTime));
                        table.Columns.Add("person", typeof(string));
                        table.Columns.Add("note", typeof(string));
                        table.Columns.Add("role", typeof(int));
                        while (reader.Read())
                        {
                            table.Rows.Add(
                                reader["id"],
                                reader["product_code"],
                                reader["number_of_product"],
                                reader["delivery"],
                                reader["elimination"],
                                reader["date"],
                                reader["person"],
                                reader["note"],
                                reader["role"]
                            );
                        }
                        reader.Close();
                    }
                    dataGridView1.DataSource = table;
                    offsetCR = oldOffset - rowsCR;
                }
            }
            else if(tabControl1.SelectedIndex == 1)
            {
                if(offsetWR > 0)
                {
                    int oldOffset = offsetWR;
                    offsetWR -= rowsWR;

                    DataTable table = new DataTable();
                    using (SqlConnection connection = new SqlConnection(sqlConnection.ConnectionString))
                    {
                        connection.Open();

                        string query = "SELECT * FROM [warranty_repair] ORDER BY id DESC OFFSET @offset ROWS FETCH NEXT @rows ROWS ONLY";
                        SqlCommand command = new SqlCommand(query, connection);
                        command.Parameters.AddWithValue("@offset", offsetWR);
                        command.Parameters.AddWithValue("@rows", rowsWR);

                        SqlDataReader reader = command.ExecuteReader();
                        table.Columns.Add("id", typeof(int));
                        table.Columns.Add("product_code", typeof(string));
                        table.Columns.Add("number_of_product", typeof(int));
                        table.Columns.Add("year_of_release", typeof(DateTime));
                        table.Columns.Add("act_number", typeof(string));
                        table.Columns.Add("date", typeof(DateTime));
                        table.Columns.Add("person", typeof(string));
                        table.Columns.Add("organization", typeof(string));
                        table.Columns.Add("note", typeof(string));
                        table.Columns.Add("role", typeof(int));

                        while (reader.Read())
                        {
                            table.Rows.Add(
                                reader["id"],
                                reader["product_code"],
                                reader["number_of_product"],
                                reader["year_of_release"],
                                reader["act_number"],
                                reader["date"],
                                reader["person"],
                                reader["organization"],
                                reader["note"],
                                reader["role"]
                            );
                        }
                        reader.Close();
                    }
                    dataGridView2.DataSource = table;
                    offsetWR = oldOffset - rowsWR;
                }
            }
            else if(tabControl1.SelectedIndex == 2)
            {
                if(offsetOW > 0)
                {
                    int oldOffset = offsetOW;
                    offsetOW -= rowsOW;
                    DataTable table = new DataTable();
                    using (SqlConnection connection = new SqlConnection(sqlConnection.ConnectionString))
                    {
                        connection.Open();
                        string query = "SELECT * FROM [one_week_check] ORDER BY id DESC OFFSET @offset ROWS FETCH NEXT @rows ROWS ONLY";
                        SqlCommand command = new SqlCommand(query, connection);
                        command.Parameters.AddWithValue("@offset", offsetOW);
                        command.Parameters.AddWithValue("@rows", rowsOW);
                        SqlDataReader reader = command.ExecuteReader();
                        table.Columns.Add("id", typeof(int));
                        table.Columns.Add("product_code", typeof(string));
                        table.Columns.Add("number_of_product", typeof(int));
                        table.Columns.Add("date", typeof(DateTime));
                        table.Columns.Add("date_make", typeof(DateTime));
                        table.Columns.Add("corresponds", typeof(string));
                        table.Columns.Add("person", typeof(string));
                        table.Columns.Add("note", typeof(string));
                        table.Columns.Add("role", typeof(int));
                        while (reader.Read())
                        {
                            table.Rows.Add(
                                reader["id"],
                                reader["product_code"],
                                reader["number_of_product"],
                                reader["date"],
                                reader["date_make"],
                                reader["corresponds"],
                                reader["person"],
                                reader["note"],
                                reader["role"]
                            );
                        }
                        reader.Close();
                    }
                    dataGridView3.DataSource = table;
                    offsetOW = oldOffset - rowsOW;
                }
            }
        }*/
        private void btnPrevPage_Click(object sender, EventArgs e)
        {
            if (tabControl1.SelectedIndex == 0)
            {
                if (offsetCR > 0)
                {
                    int oldOffset = offsetCR;
                    offsetCR -= rowsCR;
                    DataTable table = new DataTable();
                    string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
                    using (SQLiteConnection connection = new SQLiteConnection(connectionString))
                    {
                        connection.Open();
                        string query = "SELECT * FROM current_repairs ORDER BY id DESC LIMIT @rows OFFSET @offset";
                        SQLiteCommand command = new SQLiteCommand(query, connection);
                        command.Parameters.AddWithValue("@offset", offsetCR);
                        command.Parameters.AddWithValue("@rows", rowsCR);
                        SQLiteDataReader reader = command.ExecuteReader();
                        table.Columns.Add("id", typeof(int));
                        table.Columns.Add("product_code", typeof(string));
                        table.Columns.Add("number_of_product", typeof(int));
                        table.Columns.Add("delivery", typeof(string));
                        table.Columns.Add("elimination", typeof(string));
                        table.Columns.Add("date", typeof(DateTime));
                        table.Columns.Add("person", typeof(string));
                        table.Columns.Add("note", typeof(string));
                        table.Columns.Add("role", typeof(int));
                        while (reader.Read())
                        {
                            table.Rows.Add(
                                reader["id"],
                                reader["product_code"],
                                reader["number_of_product"],
                                reader["delivery"],
                                reader["elimination"],
                                reader["date"],
                                reader["person"],
                                reader["note"],
                                reader["role"]
                            );
                        }
                        reader.Close();
                    }
                    dataGridView1.DataSource = table;
                    offsetCR = oldOffset - rowsCR;
                }
            }
            else if (tabControl1.SelectedIndex == 1)
            {
                if (offsetWR > 0)
                {
                    int oldOffset = offsetWR;
                    offsetWR -= rowsWR;

                    DataTable table = new DataTable();
                    string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
                    using (SQLiteConnection connection = new SQLiteConnection(connectionString))
                    {
                        connection.Open();

                        string query = "SELECT * FROM warranty_repair ORDER BY id DESC LIMIT @rows OFFSET @offset";
                        SQLiteCommand command = new SQLiteCommand(query, connection);
                        command.Parameters.AddWithValue("@offset", offsetWR);
                        command.Parameters.AddWithValue("@rows", rowsWR);

                        SQLiteDataReader reader = command.ExecuteReader();
                        table.Columns.Add("id", typeof(int));
                        table.Columns.Add("product_code", typeof(string));
                        table.Columns.Add("number_of_product", typeof(int));
                        table.Columns.Add("year_of_release", typeof(DateTime));
                        table.Columns.Add("act_number", typeof(string));
                        table.Columns.Add("date", typeof(DateTime));
                        table.Columns.Add("person", typeof(string));
                        table.Columns.Add("organization", typeof(string));
                        table.Columns.Add("note", typeof(string));
                        table.Columns.Add("role", typeof(int));

                        while (reader.Read())
                        {
                            table.Rows.Add(
                                reader["id"],
                                reader["product_code"],
                                reader["number_of_product"],
                                reader["year_of_release"],
                                reader["act_number"],
                                reader["date"],
                                reader["person"],
                                reader["organization"],
                                reader["note"],
                                reader["role"]
                            );
                        }
                        reader.Close();
                    }
                    dataGridView2.DataSource = table;
                    offsetWR = oldOffset - rowsWR;
                }
            }
            else if (tabControl1.SelectedIndex == 2)
            {
                if (offsetOW > 0)
                {
                    int oldOffset = offsetOW;
                    offsetOW -= rowsOW;
                    DataTable table = new DataTable();
                    string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
                    using (SQLiteConnection connection = new SQLiteConnection(connectionString))
                    {
                        connection.Open();
                        string query = "SELECT * FROM one_week_check ORDER BY id DESC LIMIT @rows OFFSET @offset";
                        SQLiteCommand command = new SQLiteCommand(query, connection);
                        command.Parameters.AddWithValue("@offset", offsetOW);
                        command.Parameters.AddWithValue("@rows", rowsOW);
                        SQLiteDataReader reader = command.ExecuteReader();
                        table.Columns.Add("id", typeof(int));
                        table.Columns.Add("product_code", typeof(string));
                        table.Columns.Add("number_of_product", typeof(int));
                        table.Columns.Add("date", typeof(DateTime));
                        table.Columns.Add("date_make", typeof(DateTime));
                        table.Columns.Add("corresponds", typeof(string));
                        table.Columns.Add("person", typeof(string));
                        table.Columns.Add("note", typeof(string));
                        table.Columns.Add("role", typeof(int));
                        while (reader.Read())
                        {
                            table.Rows.Add(
                                reader["id"],
                                reader["product_code"],
                                reader["number_of_product"],
                                reader["date"],
                                reader["date_make"],
                                reader["corresponds"],
                                reader["person"],
                                reader["note"],
                                reader["role"]
                            );
                        }
                        reader.Close();
                    }
                    dataGridView3.DataSource = table;
                    offsetOW = oldOffset - rowsOW;
                }
            }
        }

        /*
        private void btnNextPage_Click(object sender, EventArgs e)
        {
            if (sqlConnection.State == ConnectionState.Closed)
            {
                sqlConnection.Open();
            }
            role = pm.GetRole(Email, sqlConnection);

            if (tabControl1.SelectedIndex == 0)
            {
                LoadMoreDataCurrentRepairs();
                OutLoadMoreDataCurrentRepairs(role);
            }
            else if (tabControl1.SelectedIndex == 1)
            {
                LoadMoreDataWarrantyRepair();
                OutLoadMoreDataWarrantyRepair(role);
            }
            else if (tabControl1.SelectedIndex == 2)
            {
                LoadMoreDataOneWeekCheck();
                OutLoadMoreDataOneWeekCheck(role);
            }

            if (sqlConnection.State != ConnectionState.Closed)
            {
                sqlConnection.Close();
            }
        }*/
        private void btnNextPage_Click(object sender, EventArgs e)
        {
            string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                connection.Open();
                role = pm.GetRole(Email, connection);

                if (tabControl1.SelectedIndex == 0)
                {
                    LoadMoreDataCurrentRepairs();
                    OutLoadMoreDataCurrentRepairs(role);
                }
                else if (tabControl1.SelectedIndex == 1)
                {
                    LoadMoreDataWarrantyRepair();
                    OutLoadMoreDataWarrantyRepair(role);
                }
                else if (tabControl1.SelectedIndex == 2)
                {
                    LoadMoreDataOneWeekCheck();
                    OutLoadMoreDataOneWeekCheck(role);
                }
            }
        }

        /*
        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (sqlConnection.State == ConnectionState.Closed)
            {
                sqlConnection.Open();
            }
            role = pm.GetRole(Email, sqlConnection);

            if (tabControl1.SelectedIndex == 0)
            {
                offsetCR = 0;
                rowsCR = 50;
                LoadMoreDataCurrentRepairs();
                OutLoadMoreDataCurrentRepairs(role);
            }
            else if (tabControl1.SelectedIndex == 1)
            {
                offsetWR = 0;
                rowsWR = 50;
                LoadMoreDataWarrantyRepair();
                OutLoadMoreDataWarrantyRepair(role);
            }
            else if (tabControl1.SelectedIndex == 2)
            {
                offsetOW = 0;
                rowsOW = 50;
                LoadMoreDataOneWeekCheck();
                OutLoadMoreDataOneWeekCheck(role);
            }

            int tabIndex = tabControl1.SelectedIndex;
            List<Tuple<string, string>> collection = GetCollection(tabIndex);
            comboBox1.DataSource = collection.Select(x => x.Item1).ToList();

            if (sqlConnection.State != ConnectionState.Closed)
            {
                sqlConnection.Close();
            }
        }*/
        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                connection.Open();
                role = pm.GetRole(Email, connection);

                if (tabControl1.SelectedIndex == 0)
                {
                    offsetCR = 0;
                    rowsCR = 50;
                    LoadMoreDataCurrentRepairs();
                    OutLoadMoreDataCurrentRepairs(role);
                }
                else if (tabControl1.SelectedIndex == 1)
                {
                    offsetWR = 0;
                    rowsWR = 50;
                    LoadMoreDataWarrantyRepair();
                    OutLoadMoreDataWarrantyRepair(role);
                }
                else if (tabControl1.SelectedIndex == 2)
                {
                    offsetOW = 0;
                    rowsOW = 50;
                    LoadMoreDataOneWeekCheck();
                    OutLoadMoreDataOneWeekCheck(role);
                }

                int tabIndex = tabControl1.SelectedIndex;
                List<Tuple<string, string>> collection = GetCollection(tabIndex);
                comboBox1.DataSource = collection.Select(x => x.Item1).ToList();
            }
        }

        /*
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (sqlConnection.State == ConnectionState.Closed)
            {
                sqlConnection.Open();
            }
            int role = pm.GetRole(Email, sqlConnection);

            if (string.IsNullOrWhiteSpace(textBox1.Text))
            {
                ResetFilter(tabControl1.SelectedIndex, role);
            }
            else if (textBox1.Text.Length >= 2)
            {
                string columnName = GetColumnName(tabControl1.SelectedIndex, comboBox1.SelectedItem.ToString());
                if (tabControl1.SelectedIndex == 0)
                {
                    FilterData("current_repairs", columnName, textBox1.Text, dataGridView1, role);
                    OutLoadMoreDataCurrentRepairs(role);
                }
                else if (tabControl1.SelectedIndex == 1)
                {
                    FilterData("warranty_repair", columnName, textBox1.Text, dataGridView2, role);
                    OutLoadMoreDataWarrantyRepair(role);
                }
                else if (tabControl1.SelectedIndex == 2)
                {
                    FilterData("one_week_check", columnName, textBox1.Text, dataGridView3, role);
                    OutLoadMoreDataOneWeekCheck(role);
                }
            }
            sqlConnection.Close();
        }*/
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                connection.Open();
                int role = pm.GetRole(Email, connection);

                if (string.IsNullOrWhiteSpace(textBox1.Text))
                {
                    ResetFilter(tabControl1.SelectedIndex, role);
                }
                else if (textBox1.Text.Length >= 2)
                {
                    string columnName = GetColumnName(tabControl1.SelectedIndex, comboBox1.SelectedItem.ToString());
                    if (tabControl1.SelectedIndex == 0)
                    {
                        FilterData("current_repairs", columnName, textBox1.Text, dataGridView1, role);
                        OutLoadMoreDataCurrentRepairs(role);
                    }
                    else if (tabControl1.SelectedIndex == 1)
                    {
                        FilterData("warranty_repair", columnName, textBox1.Text, dataGridView2, role);
                        OutLoadMoreDataWarrantyRepair(role);
                    }
                    else if (tabControl1.SelectedIndex == 2)
                    {
                        FilterData("one_week_check", columnName, textBox1.Text, dataGridView3, role);
                        OutLoadMoreDataOneWeekCheck(role);
                    }
                }
            }
        }

        private void ToolStripMenuItemSave_Click(object sender, EventArgs e)
        {
            switch (tabControl1.SelectedIndex)
            {
                case 0:
                    SaveTableDataGridView(dataGridView1);
                    break;
                case 1:
                    SaveTableDataGridView(dataGridView2);
                    break;
                case 2:
                    SaveTableDataGridView(dataGridView3);
                    break;
                default:
                    MessageBox.Show("Не выбрана вкладка с таблицей!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
            }
        }

        private void ToolStripMenuItemPrint_Click(object sender, EventArgs e)
        {
            DataGridView dataGridView = null;

            switch (tabControl1.SelectedIndex)
            {
                case 0:
                    dataGridView = dataGridView1;
                    break;
                case 1:
                    dataGridView = dataGridView2;
                    break;
                case 2:
                    dataGridView = dataGridView3;
                    break;
                default:
                    MessageBox.Show("Не выбрана вкладка с таблицей!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
            }

            PrintTableDataGridView(dataGridView);
        }

        private void BDViewsDG_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (Role == 3)
            {
                Application.Exit();
            }
            timer1.Enabled = false;
        }

        private void BDViewsDG_FormClosing(object sender, FormClosingEventArgs e)
        {
            using (SQLiteConnection connection = new SQLiteConnection(ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString))
            {
                connection.Open();

                ConfigManager.SaveConfig(GetLastId(connection, "current_repairs"), GetLastId(connection, "warranty_repair"), GetLastId(connection, "one_week_check"));
            }
        }

        private void BDViewsDG_Load(object sender, EventArgs e)
        {

        }

        private Random random = new Random();

        private void timer1_Tick(object sender, EventArgs e)
        {
            string connectionString = ConfigurationManager.ConnectionStrings["PDATA"].ConnectionString;
            try
            {
                using (SQLiteConnection connection = new SQLiteConnection(connectionString))
                {
                    connection.Open();
                    int role = pm.GetRole(Email, connection);

                    label2.BackColor = Color.LightGreen;
                    label2.Text = "Последнее обращение к БД: "+ sqliteConnection.ConnectionString +" было в " + DateTime.Now.ToString();

                    if (string.IsNullOrWhiteSpace(textBox1.Text))
                    {
                        ResetFilter(tabControl1.SelectedIndex, role);
                    }
                    else if (textBox1.Text.Length >= 2)
                    {
                        string columnName = GetColumnName(tabControl1.SelectedIndex, comboBox1.SelectedItem.ToString());
                        if (tabControl1.SelectedIndex == 0)
                        {
                            FilterData("current_repairs", columnName, textBox1.Text, dataGridView1, role);
                            OutLoadMoreDataCurrentRepairs(role);
                        }
                        else if (tabControl1.SelectedIndex == 1)
                        {
                            FilterData("warranty_repair", columnName, textBox1.Text, dataGridView2, role);
                            OutLoadMoreDataWarrantyRepair(role);
                                                    }
                        else if (tabControl1.SelectedIndex == 2)
                        {
                            FilterData("one_week_check", columnName, textBox1.Text, dataGridView3, role);
                            OutLoadMoreDataOneWeekCheck(role);
                            
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                label2.Text = "Одновременное обращение к базе, попробуйте позже.";
                label2.BackColor = Color.LightPink;

                // Добавляем рандомное значение к интервалу таймера
                int baseInterval = 100000; // Базовый интервал в миллисекундах
                int randomInterval = random.Next(500, 1500); // Рандомное значение от 500 до 1500 миллисекунд
                timer1.Interval = baseInterval + randomInterval;
            }
        }
    }
}